package com.peng.androidlib.appbase;

import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.os.Environment;
import android.support.multidex.MultiDex;
import android.text.TextUtils;

import com.blankj.utilcode.util.Utils;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.stetho.Stetho;
import com.peng.androidlib.BuildConfig;
import com.peng.androidlib.database.CustomRealmMigration;
import com.peng.androidlib.utils.LogUtils;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import io.realm.Realm;
import io.realm.RealmConfiguration;

/**
 * Created by Mr.Q on 2018/10/9.
 * 描述：
 * 1、初始化 Fresco 图像处理
 * 2、进行了分包处理
 * 3、日志打印初始化
 * 4、各种工具类初始化
 * 5、腾讯 Bugly 升级、异常上报初始化
 * 6、realm 数据库初始化，根据使用情况开放代码
 */

public class BaseApplication extends Application {

    private static BaseApplication baseApplication;

    /**
     * 分包
     *
     * @param base
     */
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // Fresco 图像处理
        Fresco.initialize(this);

        baseApplication = this;

        // 日志打印初始化
        LogUtils.logInit(BuildConfig.DEBUG);

        // 初始化工具类集
        Utils.init(this);

        // 初始化腾讯bug管理平台
        initBugly();

        initRealm();
    }

    private void initRealm() {

        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("my.realm")
                .schemaVersion(0x01)
                .migration(new CustomRealmMigration())
                .deleteRealmIfMigrationNeeded()//声明版本冲突时自动删除原数据库。
                .build();
        Realm.setDefaultConfiguration(config);

        /**
         * Stetho 配置，用于在chrome://inspect中查看数据库
         */
        Stetho.initialize(Stetho.newInitializerBuilder(this)
                .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
                .build());
    }

    public static Context getAppContext() {
        return baseApplication;
    }

    public static Resources getAppResources() {
        return baseApplication.getResources();
    }

    /**
     * 初始化腾讯bug管理平台
     */
    private void initBugly() {
//        setBugly();
        Bugly.init(this, "4bca37fcb5", true);
    }

    private void setBugly() {
        /**
         * true 表示 app 启动自动初始化升级模块；
         * false 不自动初始化
         */
        Beta.autoInit = true;

        /**
         * true 表示初始化时自动检查升级
         * false 表示不会自动检查升级，需要手动调用 Beta.checkUpgrade()方法
         */
        Beta.autoCheckUpgrade = false;

        /**
         * 设置升级周期为60s（默认检查周期为0s），60s 内 SDK 不重复向后台请求策略
         */
        Beta.initDelay = 1 * 1000;

        /**
         * 设置通知栏大图标，largeIconId 为项目中的图片资源；
         */
        //Beta.largeIconId = R.mipmap.kds;

        /**
         * 设置状态栏小图标，smallIconId 为项目中的图片资源 id;
         */
        //Beta.smallIconId = R.mipmap.kds;

        /**
         * 设置更新弹窗默认展示的banner，defaultBannerId 为项目中的图片资源Id;
         * 当后台配置的 banner 拉取失败时显示此 banner，默认不设置则展示“loading“;
         */
        //Beta.defaultBannerId = R.mipmap.kds;

        /**
         * 设置 sd 卡的 Download 为更新资源保存目录;
         * 后续更新资源会保存在此目录，需要在 manifest 中添加 WRITE_EXTERNAL_STORAGE 权限;
         */
        Beta.storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

        /**
         * 点击过确认的弹窗在 APP 下次启动自动检查更新时会再次显示;
         */
        Beta.showInterruptedStrategy = true;

        /**
         * 设置是否显示消息通知
         */
        Beta.enableNotification = true;

        /**
         * 使用默认弹窗
         */
        Beta.canShowApkInfo = true;
        /**
         * 关闭或开启热更新能力,默认开启
         */
        Beta.enableHotfix = false;

        /**
         * 只允许在MainActivity上显示更新弹窗，其他activity上不显示弹窗;
         * 不设置会默认所有activity都可以显示弹窗;
         */
        // 不在登录activity上显示弹窗
        //Beta.canNotShowUpgradeActs.add(.class);
    }

    /**
     * 获取进程号对应的进程名
     *
     * @param pid 进程号
     * @return 进程名
     */
    private static String getProcessName(int pid) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
            String processName = reader.readLine();
            if (!TextUtils.isEmpty(processName)) {
                processName = processName.trim();
            }
            return processName;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException exception) {
                exception.printStackTrace();
            }
        }
        return null;
    }
}
